package com.hurried1y.controller;


import com.hurried1y.annotation.Log;
import com.hurried1y.annotation.RateLimiter;
import com.hurried1y.exception.SystemException;
import com.hurried1y.model.enums.BizCodeEnum;
import com.hurried1y.model.vo.UserConsumeVo;
import com.hurried1y.model.vo.UserWalletVo;
import com.hurried1y.service.UserWalletService;
import com.hurried1y.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * (UserWallet)表控制层
 *
 * @author Hurried1y
 * @since 2023-06-19 11:09:20
 * @description
 *  实现Java面试题，对用户钱包进行操作的几个api接口
 *  1. 查询用户钱包余额
 *  2. 用户消费100元的接口
 *  3. 用户退款20元接口
 *  4. 查询用户钱包金额变动明细的接口
 *
 */
@Slf4j
@RestController
@RequestMapping("/userWallet")
public class UserWalletController{
    @Autowired
    private UserWalletService userWalletService;

    /**
     * 查询用户钱包余额
     * @param userId 用户id
     * @return 用户钱包vo
     */
    @Log(title = "查询用户钱包余额")
    @GetMapping("/getUserWallet/{userId}")
    @RateLimiter(count = 5)
    public R getUserWallet(@PathVariable("userId") Long userId){
        UserWalletVo userWalletVo = userWalletService.getUserWallet(userId);
        return R.ok().put("data", userWalletVo);
    }

    /**
     * 用户消费100元的接口，用户退款20元接口，调用限流注解
     * @param consumeVo 用户消费vo -- 其中包含updateType、updateSource
     * @return R
     */
    @RateLimiter(count = 5)
    @PostMapping("/consume")
    public R consume(@RequestBody UserConsumeVo consumeVo){
        try {
            userWalletService.consume(consumeVo);
        } catch (Exception e){
            log.error("用户消费失败，数据回滚...");
            log.error("异常信息：{}", e.getMessage());
            throw new SystemException(BizCodeEnum.SYSTEM_ERROR.getCode(), BizCodeEnum.SYSTEM_ERROR.getMsg());
        }
        return R.ok();
    }
}

